<h1>日志处理</h1>

<p>beego 之前介绍的时候说过是基于几个模块搭建的，beego 的日志处理是基于 logs 模块搭建的，内置了一个变量 <code>BeeLogger</code>，默认已经是 <code>logs.BeeLogger</code> 类型，初始化了 console，也就是默认输出到 <code>console</code>。</p>

<h2>使用入门</h2>

<p>一般在程序中我们使用如下的方式进行输出：</p>

<pre><code>beego.Emergency(&quot;this is emergency&quot;)
beego.Alert(&quot;this is alert&quot;)
beego.Critical(&quot;this is critical&quot;)
beego.Error(&quot;this is error&quot;)
beego.Warning(&quot;this is warning&quot;)
beego.Notice(&quot;this is notice&quot;)
beego.Informational(&quot;this is informational&quot;)
beego.Debug(&quot;this is debug&quot;)
</code></pre>

<h2>设置输出</h2>

<p>我们的程序往往期望把信息输出到 log 中，现在设置输出到文件很方便，如下所示：</p>

<pre><code>beego.SetLogger(&quot;file&quot;, `{&quot;filename&quot;:&quot;logs/test.log&quot;}`)
</code></pre>

<p>更多详细的日志配置请查看 <a href="../../module/logs.md">日志配置</a></p>

<p>这个默认情况就会同时输出到两个地方，一个 console，一个 file，如果只想输出到文件，就需要调用删除操作：</p>

<pre><code>beego.BeeLogger.DelLogger(&quot;console&quot;)
</code></pre>

<h2>设置级别</h2>

<p>日志的级别如上所示的代码这样分为八个级别：</p>

<pre><code>LevelEmergency
LevelAlert
LevelCritical
LevelError
LevelWarning
LevelNotice
LevelInformational
LevelDebug
</code></pre>

<p>级别依次降低，默认全部打印，但是一般我们在部署环境，可以通过设置级别设置日志级别：</p>

<pre><code>beego.SetLevel(beego.LevelInformational)
</code></pre>

<h2>输出文件名和行号</h2>

<p>日志默认不输出调用的文件名和文件行号,如果你期望输出调用的文件名和文件行号,可以如下设置</p>

<pre><code>beego.SetLogFuncCall(true)
</code></pre>

<p>开启传入参数 true, 关闭传入参数 false, 默认是关闭的.</p>

<h2>完整示例</h2>

<pre lang="go"><code>func internalCalculationFunc(x, y int) (result int, err error) {
    beego.Debug(&quot;calculating z. x:&quot;, x, &quot; y:&quot;, y)
    z := y
    switch {
    case x == 3:
        beego.Debug(&quot;x == 3&quot;)
        panic(&quot;Failure.&quot;)
    case y == 1:
        beego.Debug(&quot;y == 1&quot;)
        return 0, errors.New(&quot;Error!&quot;)
    case y == 2:
        beego.Debug(&quot;y == 2&quot;)
        z = x
    default:
        beego.Debug(&quot;default&quot;)
        z += x
    }
    retVal := z - 3
    beego.Debug(&quot;Returning &quot;, retVal)

    return retVal, nil
}

func processInput(input inputData) {
    defer func() {
        if r := recover(); r != nil {
            beego.Error(&quot;Unexpected error occurred: &quot;, r)
            outputs &lt;- outputData{result: 0, error: true}
        }
    }()
    beego.Informational(&quot;Received input signal. x:&quot;, input.x, &quot; y:&quot;, input.y)

    res, err := internalCalculationFunc(input.x, input.y)
    if err != nil {
        beego.Warning(&quot;Error in calculation:&quot;, err.Error())
    }

    beego.Informational(&quot;Returning result: &quot;, res, &quot; error: &quot;, err)
    outputs &lt;- outputData{result: res, error: err != nil}
}

func main() {
    inputs = make(chan inputData)
    outputs = make(chan outputData)
    criticalChan = make(chan int)
    beego.Informational(&quot;App started.&quot;)

    go consumeResults(outputs)
    beego.Informational(&quot;Started receiving results.&quot;)

    go generateInputs(inputs)
    beego.Informational(&quot;Started sending signals.&quot;)

    for {
        select {
        case input := &lt;-inputs:
            processInput(input)
        case &lt;-criticalChan:
            beego.Critical(&quot;Caught value from criticalChan: Go shut down.&quot;)
            panic(&quot;Shut down due to critical fault.&quot;)
        }
    }
}
</code></pre>
